其他

看雪.WiFi万能钥匙 CTF 2017第十五题 点评及解题思路

2017-07-01 看雪学院

看雪CTF 2017 比赛进行至第十五题

截止至今天中午12点,第十五题破解人数为 9 人!

防守方 hsadkhk 依然位居首位~

今天是最后一题,攻击方风间仁处于第一位~,kkHAIKE位列第二位。

比赛至此告一段落了,

比赛的最终结果,请大家持续关注!

接下来我们来回顾一下第十五题

看看 看雪评委和出题者是怎么说的ヾ(๑╹◡╹)ノ"。


看雪评委 netwind 点评


题目中的VM是作者设计的一个全新的VM,体积虽小,五脏俱全。VM功能包括反调试、反虚拟机、反 API 断点、导入表保护、OEP 抽取,代码虚拟化、代码乱序、代码拆分、代码混淆;攻方需了解vm的基本知识,识别出各条handler,然后根据各handler序列分析出整个流程;作者同时采用lua脚本来进行代码保护,攻方还需掌握lua反编译知识;在算法上采用了简单的异或算法。此题重在考察选手VM分析能力和LUA反编译能力。

作者简介

demoscene,反病毒工程师,反外挂工程师。


看雪 CTF 2017 第十五题设计思路


一、设计思路

一个专业实用的保护系统应该不仅能防 keygen 还应该能防爆破防代码分析

纵观当前市面上最好的几款保护,使用的技术皆为 RSA 算法+代码虚拟化保护,这是当前最流行,最强的软件保护技术。

题目设计主要考察分析vm的能力,所以不使用复杂的算法,只进行了简单的异或。

根据去年CTF时各位大牛写的分析文章,对VM的弱点进行了修补,增强了VM的强度。

吸收去年CTF其它守护方的设计思路,结合lua脚本,实现双虚拟机保护。

二、设计亮点

1、一个体积虽小,五脏俱全的新VM,非市面上已经被N多人分析过的VM,需要攻击者重新分析,考察分析VM的基本功。

vm实现的功能:反调试、反虚拟机、反 API 断点、导入表保护、OEP 抽取,代码虚拟化、代码乱序、代码拆分、代码混淆。

2、结合 lua 脚本,使用自写虚拟机+lua虚拟机,实现双虚拟机保护。

       考察攻击者的 lua 反编译知识。

3、不用使复杂算法,避免算法分析。

三、破解思路

1、由于本题只是对输入进行了简单的异或判断,所以无需费力气分析算法,只要把 vm 流程,各个 handler 分析清楚,找到异或的 key 即可。目前壳处理的指令还比较少,混淆模式也比较简单,所以要理清楚并不难,只是由于大家都第一次接触到此 VM,所以可能需要花点时间。

2、本题算法较简单,主要难点在分析VM和反编译lua脚本上

3、分析vm要求大家了解vm的基本知识,vm的整体框架,流程,然后区分出花掉令和正常的指令,去掉花指令,保留正常指令,识别出各条handler,然后根据各handler序列分析出整个流程

4、反编译lua需要找到lua字节码并保存下来,然后使用网上的方法,进行反编译,这里的难点在于找到 lua_loadbuffer的地址,在此函数里把字节码dump下来即可

四、其它说明

1、CrackMe使用vs2008编译,已在xp,win7 32、 win7 64系统上测试功能正常

2、CrackMe使用自己实现的虚拟机BBProtect加密,之前未曾发在网上,复合题目要求

3、BBProtect 程序在已放到 BBProtect目录里

4、由于加了vm,所以杀软软件可能会报毒,cm没有任何恶意功能,可放心运行


下面选取攻击者 loudy 的破解分析


使用工具:IDA6.8(反汇编分析) python(编程解码) OD(动态调试)

步    骤:

一、定位关键代码

该程序有加壳,但对主要流程影响不大,难点在于分析luajit代码,定位主要流程。只要流程清晰了,该题没有难度,只是简单异或运算。

(1)脱壳

其实也不算真正脱壳,其实就是等程序运行起来后,dump内存镜像。

这样在IDA中可以分析解密后的函数和解密后的字符串,如下图

(2)定位关键点

从IDA的字符串窗口可以看到该程序使用了LuaJIT 2.1.0-beta3 且Lua版本号为Lua 5.1。

通过“main”(调用Lua的main函数)关键字在IDA中定位到如下位置。

其上面从0040103D开始的一大段mov指令实际是在栈中生成了一个luajit的bytecode。

二、解密

通过OD动态加载后,通过识别luajit文件头{0x1b,0x4c,0x4a}提取出该文件。

接下来Google找到luajit-decomp项目源码和LuaJIT-2.1.0-beta3源码,编译luajit,替换luajit-decomp中的对应文件,对提取出的luajit反编译,得到如下结果。

我们主要关注其中的main函数,上面已经用c语法注释出来。其实就是对输入分别与下面这一串异或,返回结果。

[112,101,100,105,121,49,50,51,52,53,54,55]

接下来0040222C处的代码取得lua输出的每一个值分别与下面这一串值异或。

[0x5,0x12,0xa,0x29,0x42,0x41,0x75,0x61,0x35,0x83,0x55,0x94]

接下来004022F0处,异或后的值分别与下面着串值比较,相等则注册成功。

[0x18,0x16,0x1e,0x2f,0x48,0x11,0x21,0x37,0x33,0x86,0x52,0x94]

那么python编写如下代码,即可得到真正注册码“maposafe2017”。

全文完,注册码“maposafe2017”。


最后感谢 WiFi 万能钥匙安全应急响应中心的赞助支持,

接下来的比赛大家一定要使出洪荒之力哦!↖(^ω^)↗

比心 ❤



赞助商

上海连尚网络科技有限公司成立于 2013 年,是一家专注于提供免费上网和内容服务的移动互联网企业。连尚网络自主研发的核心产品 WiFi 万能钥匙,以分享经济的模式,通过云计算和大数据技术,利用热点主人分享的闲置WiFi资源,为用户提供免费、稳定、安全的上网服务,以帮助更多的人上网,找到属于他们的机会,改变自己的命运。


往期热门内容推荐



更多比赛详情,长按下方二维码,“关注看雪学院公众号”查看!

看雪论坛:http://bbs.pediy.com/

微信公众号 ID:ikanxue

微博:看雪安全

商务合作:wsc@kanxue.com




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存